const router = require('express').Router()
const bcrypt = require('bcrypt')
const path=require('path')

const uploadMusic=require('../config/uploadMusic')
const uploadImg=require('../config/uploadImg')

//token相关
const jwt = require('jsonwebtoken')
const jwt_key = require('../secret/jwtkey').KEYORSECRET

//引入Date日期格式化原型方法（日期格式化后还需要引入）
require('../config/Date')


//数据库模型
const Admin = require('../dbModel/admin')
const Music = require('../dbModel/music')
const Likes = require('../dbModel/likes')
const Order = require('../dbModel/order')


//管理员登录
router.post('/account/login', (req, res) => {
    // console.log('post /account/login');
    // 获取邮箱
    const email = req.body.email
    // console.log(('email=>',email));
    //从数据库中检验邮箱
    Admin.findOne({
        email: email
    }).then(admin => {
        console.log('admin=>', admin);
        if (!admin) {  //邮箱不存在
            res.status(406).json({ status: '406', result: '用户名或者密码错误' })
        } else {  //邮箱存在
            const password = req.body.password//前端传递过来
            const dbPassword = admin.password //数据库中查询出来的 ,是经过加密的密码，所以需要解密
            const isValidPassword = bcrypt.compareSync(password, dbPassword)   //password ===dbPassword

            if (!isValidPassword) {  //密码不匹配
                res.status(406).json({ status: '406', result: '用户名或者密码错误' })
            } else { //登陆成功
                //颁发token jsonwebtoken 携带用户信息
                const rule = {
                    id: String(admin._id),
                    email: admin.email,
                    username: admin.username,
                    date: admin.date,
                    identity: admin.identity    //不能公开的信息不能放里面，比如密码
                }
                jwt.sign(rule, jwt_key, { expiresIn: 3600 }, (err, token) => {
                    if (err) {
                        console.log('jwt.sign error=>', err);
                        res.status(500).json({ status: '500', result: '未知错误' })
                    } else {
                        res.status(200).json({ status: "200", result: '登陆成功', token: 'Bearer' + token })
                    }
                })
                // res.status(200).json({ status: '200', result: '登陆成功' })
            }
        }
    })
})

//管理员注册
router.post('/account/register', (req, res) => { //做post请求的时候，如果express要接收post请求，是json格式的话，需要配置一个中间件去解析
    const email = req.body.email      //因为是post请求，所以可以从body中获取email，同下
    //邮箱不能重复
    Admin.findOne({
        email
    }).then(hasOne => {
        if (hasOne) {  //已存在相同的邮箱
            res.status(422).json({
                status: 422,
                result: "邮箱已存在"
            })
        } else {  //不存在相同的邮箱
            const username = req.body.username
            const password = req.body.password
            const identity = req.body.identity
            const date = new Date().format("yyyy/MM//dd HH:mm:ss")

            const newAdmin = new Admin({  //新增一个文档
                email,
                username,
                password,
                identity,
                date
            })

            newAdmin.save().then(() => {       //成功后
                res.status(200).json({
                    status: 200,
                    result: '注册成功'
                })
            })
            .catch(err => {   //失败后
                console.log('err=>', err.message);   //固定写法
                res.status(500).json({     //返回json形式   status是系统状态
                    status: '500',     //自己设置的状态   两个status是不一样的
                    result: '服务器內部错误，注册失败'
                })
            })
        }
    })

})

//添加开户记录
router.post('/music/addAccount',(req,res)=>{
    var stringRandom = require('string-random');
    var moment = require('moment');
    var date = new Date();
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    if( month < 10 ){var month = '0' + month}
    var dates = date.getDate();
    const _id = ( year +''+ month+'' + dates ) + '_' + parseInt(Math.random() * 100000);
    const account = stringRandom(9, { numbers: true }) + '@cc.com'
    const password = stringRandom(8, { letters: false })
    const time = req.body.time
    const amount = time * 20
    const start = new Date().format("yyyy-MM-dd HH:mm:ss")
    const end = moment().add(time,"hours").format("YYYY-MM-DD HH:mm:ss")
    const key = new Buffer.from(password, 'base64').toString('hex')  
    const order = {
        account,
        password,
        time,
        amount,
        _id,
        start,
        end,
        key
    }
    const newOrder = new Order(order)
        newOrder.save().then(() => {
            res.status(200).json({
                status: '200',
                result: "开户成功",
                message:order
            })
        }).catch(err => {   //失败后
            console.log('err=>', err.message);   //固定写法
            res.status(500).json({     //返回json形式   status是系统状态
                status: '500',     //自己设置的状态   两个status是不一样的
                result: '服务器內部错误，添加歌曲失败'
            })
        })
})

//获取当前时间
router.get('/time',(req,res)=>{
    const date = new Date().format("yyyy-MM-dd HH:mm:ss")
    // console.log(date);
    res.status(200).json({
        result: date
    })
})
//管理员添加歌曲
router.post('/music/add', (req, res) => {
    const songName = req.body.songName
    const artist = req.body.artist
    const poster = req.body.poster
    const src = req.body.src
    const language = req.body.language ? req.body.language : null
    const style = req.body.style ? req.body.style : null
    // res.send({status:200,result:`${songName},${artist},${poster},${src},${language},${style}`})
    //判断歌曲是否在数据库
    Music.findOne({ songName })
        .then(hasOne => {
            if (hasOne) {  //歌曲名称已存在
                //是否存在该歌曲的不同翻唱的歌手
                const flag = hasOne.artist === req.body.artist
                if (flag) {
                    res.status(200).json({ status: '200', result: '歌曲已存在' })
                }
            } else {//歌曲名称不存在
                //todo 简化重复代码
                const song = {
                    songName,
                    artist,
                    poster,
                    src,
                    language,
                    style,
                    playCount: '0',
                    date: new Date().format("yyyy/MM//dd HH:mm:ss")
                }
                const newSong = new Music(song)
                newSong.save().then(() => {
                    res.status(200).json({
                        status: '200',
                        result: '添加成功'
                    })
                }).catch(err => {                       //失败后
                    console.log('err=>', err.message);  //固定写法
                    res.status(500).json({              //返回json形式   status是系统状态
                        status: '500',                  //自己设置的状态   两个status是不一样的
                        result: '服务器內部错误，添加歌曲失败'
                    })
                })
            }
        }
    )
})

//验证合法身份
router.post('/islegal',(req,res)=>{
    const email = req.body.email
    Admin.findOne({email}).then(islegal=>{
        if(!islegal){
            res.status(416).json({status:'416',result:'身份不合法'})
        }else{
            const password=req.body.password
            const isValidPassword=bcrypt.compareSync(password,islegal.password)
            if(!isValidPassword){
                res.status(416).json({status:'416',result:'未授权'})
            }else{
                res.status(200).json({status:'200',result:'true'})
            }
        }
    })
})

//上传歌曲
router.post('/upload/music',(req,res)=>{
    // console.log('uploadmusic=>',req.body);//然后让前端来请求
    uploadMusic(req,res)
})

// 上传海报
router.post('/upload/poster',(req,res)=>{
    uploadImg(req,res)
})

//返回歌曲的海报封面
router.get('/poster',(req,res)=>{
    //todo：判断这个海报是否存在
    //fs.existsSync()
    res.sendFile(path.resolve(__dirname,"../static/poster/"+req.query.img))
})

// 获取所有歌曲
router.get('/allmusics',(req,res)=>{
    Music.find().then(musics=>{
        // console.log('musics=>',musics);
        if(musics.length > 0){
            res.send({status:200,result:musics})
        }else{
            res.json({status:200,result:'音乐列表为空'})
        }
    })
})

//获取所有订单
router.get('/allorders',(req,res)=>{
    Order.find().then(orders=>{
        if(orders.length > 0){
            res.send({status:200,result:orders})
        }else{
            res.json({status:200,resul:'音乐列表为空'})
        }
    })
})

//根据歌曲的名称搜索
router.post('/searchByName',(req,res)=>{
    const songName = req.body.searchName.trim()
    //todo：加上or的判断 歌手的名称
    Music.find({songName:{$regex:songName,$options:'i'}})  //$regex表示正则匹配
    .then(musics=>{
        if(musics.length > 0){
            res.send({status:200,result:musics})
        }else{
            res.json({status:200,result:musics})
        }
    })
})
// 搜索订单
router.post('/searchByTime',(req,res)=>{
    const time = req.body.time
    const start = time[0]
    const end = time[1]
    // console.log("time=>",time);
    // console.log('start=>',start);
    // console.log('end=>',end);
    Order.find({"end":{"$gte":start,"$lt":end}}) 
    // Order.find({"start":[{"gmtCreate":{$gte:start}},{"gmtCreate":{$lt:end}}]})
    .then(orders=>{
        if(orders.length > 0){
            res.send({status:200,result:orders})
        }else{
            res.json({status:200,result:orders})
        }
    })
})
//根据歌曲的名称搜索推荐歌曲
router.post('/searchLikes',(req,res)=>{
    const songName = req.body.searchName.trim()
    //todo：加上or的判断 歌手的名称
    Likes.find({songName:{$regex:songName,$options:'i'}})  //$regex表示正则匹配
    .then(musics=>{
        if(musics.length > 0){
            res.send({status:200,result:musics})
        }else{
            res.json({status:200,result:musics})
        }
    })
})

// 根据歌曲删除 _id
router.post('/music/delete',(req,res)=>{
    const _id = req.body._id
    Music.findByIdAndRemove({_id})
    .then(()=>{
        res.json({status:200,result:'删除成功'})
    })
    .catch(err=>{
        console.log('删除歌曲err=>',err);
        res.status(500).json({status:500,result:'删除失败，服务器内部错误'})
    })
})
// 删除订单
router.post('/music/deleteOrder',(req,res)=>{
    const _id = req.body._id
    Order.findByIdAndRemove({_id})
    .then(()=>{
        res.json({status:200,result:'删除成功'})
    })
    .catch(err=>{
        console.log('删除订单err=>',err);
        res.status(500).json({status:500,result:'删除失败，服务器内部错误'})
    })
})
// 取消收藏
router.post('/music/deleteLikeSong',(req,res)=>{
    const _id = req.body._id
    Likes.findByIdAndRemove({_id})
    .then(()=>{
        res.json({status:200,result:'删除成功'})
    })
    .catch(err=>{
        console.log('删除歌曲err=>',err);
        res.status(500).json({status:500,result:'删除失败，服务器内部错误'})
    })
})
//编辑歌曲
router.post('/music/edit',(req,res)=>{
    //获取前端传递的歌曲id
    const _id = req.body._id

    const newSong = {}
    newSong.songName = req.body.songName
    newSong.artist = req.body.artist
    newSong.src = req.body.src
    newSong.poster = req.body.poster
    newSong.language = req.body.language
    newSong.style = req.body.style

    Music.findOneAndUpdate({_id:_id},{$set:newSong},{new:true})  //使用前得构造数据。原理：根据id查询出来，然后用新的值去覆盖
    .then(song=>{
        res.status(200).json({status:'200',result:'歌曲更新成功'})
    }).catch(err=>{
        console.log('编辑歌曲错误=>',err);
        res.status(500).json({status:500,result:'更新失败，服务器内部错误'})
    })
})

// 根据歌曲id获取某一首歌曲
router.get('/musicById',(req,res)=>{
    const _id = req.query.id   //获取拼接id ?id=xxx
    Music.findOne({_id})
    .then(music=>{
        if(music){
            res.sendFile(path.resolve(__dirname,"../static/music/" + music.src))
        }
    }).catch(err=>{
        console.log('获取歌曲失败err=>',err);
        res.status(500).json({status:500,result:'获歌曲失败，服务器内部错误'})
    })
})
// 根据收藏歌曲id获取某一首歌曲
router.get('/musicByLikeSongId',(req,res)=>{
    const _id = req.query.id   //获取拼接id ?id=xxx
    Likes.findOne({_id})
    .then(music=>{
        if(music){
            res.sendFile(path.resolve(__dirname,"../static/music/" + music.src))
        }
    }).catch(err=>{
        console.log('获取歌曲失败err=>',err);
        res.status(500).json({status:500,result:'获歌曲失败，服务器内部错误'})
    })
})

//将喜欢的歌曲添加到Likes数据库
router.post('/music/favor', (req, res) => {
    const _id = req.body._id
    const songName = req.body.songName
    const artist = req.body.artist
    const poster = req.body.poster
    const src = req.body.src
    const language = req.body.language ? req.body.language : null
    const style = req.body.style ? req.body.style : null
    // res.send({status:200,result:`${songName},${artist},${poster},${src},${language},${style}`})
    //判断歌曲是否在数据库
    Likes.findOne({ songName })
        .then(hasOne => {
            if (hasOne) {  //歌曲名称已存在
                //是否存在该歌曲的不同翻唱的歌手
                const flag = hasOne.artist === req.body.artist
                if (flag) {
                    res.status(200).json({ status: '200', result: '歌曲已存在' })
                }
            } else {//歌曲名称不存在
                //todo 简化重复代码
                const song = {
                    songName,
                    artist,
                    poster,
                    src,
                    language,
                    style,
                    playCount: '0',
                    date: new Date().format("yyyy/MM//dd HH:mm:ss")
                }
                const newSong = new Likes(song)
                newSong.save().then(() => {
                    res.status(200).json({
                        status: '200',
                        result: '添加成功'
                    })
                }).catch(err => {   //失败后
                    console.log('err=>', err.message);   //固定写法
                    res.status(500).json({     //返回json形式   status是系统状态
                        status: '500',     //自己设置的状态   两个status是不一样的
                        result: '服务器內部错误，添加歌曲失败'
                    })
                })
            }
        }
        )
})
//获取所有喜欢的歌曲
router.get('/alllikes',(req,res)=>{
    Likes.find().then(musics=>{
        // console.log('musics=>',musics);
        if(musics.length > 0){
            res.send({status:200,result:musics})
        }else{
            res.json({status:200,result:'音乐列表为空'})
        }
    })
})

//歌曲信息添加到数据库中
module.exports = router       //首先要导出去才可以注册